//==========================================================
//! Singleton.hpp
//!
//! Définition de la classe Singleton
//!
//==========================================================
#ifndef SINGLETON_HPP
#define SINGLETON_HPP

//==========================================================
// En-têtes
//==========================================================

namespace Tools
{
    //==========================================================
    // Template servant à construire les classes singleton
    //==========================================================
    template <class T>
    class Singleton
    {
    public :

        //----------------------------------------------------------------
        // Renvoie l'instance unique de la classe
        //----------------------------------------------------------------
        static T& Instance()
        {
            if (!Inst)
                Inst = new T;

            return *Inst;
        }

        //----------------------------------------------------------------
        // Détruit l'instance unique de la classe
        //----------------------------------------------------------------
        static void Destroy()
        {
            delete Inst;
            Inst = NULL;
        }

    protected :

        //----------------------------------------------------------------
        // Constructeur par défaut
        //----------------------------------------------------------------
        Singleton() {}

        //----------------------------------------------------------------
        // Destructeur
        //----------------------------------------------------------------
        ~Singleton() {}

    private :

        //----------------------------------------------------------------
        // Données membres
        //----------------------------------------------------------------
        static T* Inst; // Instance de la classe

        //----------------------------------------------------------------
        // Copie interdite
        //----------------------------------------------------------------
        Singleton(Singleton&);
        void operator =(Singleton&);
    };

    //----------------------------------------------------------------
    // Instanciation du singleton
    //----------------------------------------------------------------
    template <class T> T* Singleton<T>::Inst = NULL;

} // namespace Tools


#endif // SINGLETON_HPP
